package com.company.AtomicOption;


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 作者  Administrator
 * 时间  2017/6/2 10:01
 * 文件  ThreadPoolsDemo
 * 描述  多线程操作ValueObject
 * Lock-Free 代替锁算法
 *
 */
public class AtomicIntOption {
	public static void main(String[] args) {
//      testAtom();
	    testNormal();
//		testVolatileCounter();
	}
	public static void testAtom() {
//		MyThreadPoolExecutor et = new MyThreadPoolExecutor(0,Integer.MAX_VALUE,0L,
//				TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
		ExecutorService et = Executors.newCachedThreadPool();//不限定线程数量，有多少来多少
		final ValueObject.AtomValueObj nvo = new ValueObject.AtomValueObj();
		for (int i = 0; i < 10; i++) {
			et.execute(new Runnable() {
				@Override
				public void run() {
					try {
						Thread.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					nvo.increment();
				}
			});
		}
		if (et.isTerminated()){
			//该方法不是阻塞的
			System.out.println("最终count："+nvo.getCount());
		}else {
			System.out.println("最终count："+nvo.getCount());
		}
		/**
		 执行后的结果：2
		 执行后的结果：1
		 执行后的结果：3
		 执行后的结果：7
		 执行后的结果：10
		 执行后的结果：6
		 执行后的结果：5
		 执行后的结果：4
		 执行后的结果：9
		 执行后的结果：8
		 * */
//		et.shutdown();//把所有的任务添加完了 就等他们执行完了自动挂

	}
	public static void testNormal() {
		ExecutorService et = Executors.newCachedThreadPool();//不限定线程数量，有多少来多少
		final ValueObject.NormalValueObj nvo = new ValueObject.NormalValueObj();
		for (int i = 0; i < 10; i++) {
			et.execute(new Runnable() {
				@Override
				public void run() {
				/*	try {
						TimeUnit.MILLISECONDS.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}*/
					nvo.increment();
				}
			});
		}
		/**
		 执行后的结果：0
		 执行后的结果：2
		 执行后的结果：3
		 执行后的结果：4
		 执行后的结果：5
		 执行后的结果：1
		 执行后的结果：9
		 执行后的结果：8
		 执行后的结果：7
		 执行后的结果：6
		 * */
	}

	public static void testVolatileCounter() {
		ExecutorService et = Executors.newCachedThreadPool();//不限定线程数量，有多少来多少
		final ValueObject.VolatileCounter nvo = new ValueObject.VolatileCounter();
		for (int i = 0; i < 10; i++) {
			et.execute(new Runnable() {
				@Override
				public void run() {
					try {
						TimeUnit.MILLISECONDS.sleep(2);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					nvo.increment();
					System.out.println("当前count："+nvo.getCount());
				}
			});
		}
	}
	/** 当前count：6
		当前count：8
		当前count：8
		当前count：6
		当前count：8
		当前count：7
		当前count：7
		当前count：7
		当前count：7
		当前count：8
		*/
}
